/* eslint-disable global-require */

/*
 * @Descripttion: 动态读取mock文件夹下xx.js以及 pages文件夹下 /_mock.js 文件
 * @version: v1.0.0
 * @Author: huangjunjian
 * @email: huangjunjian@longfor.com
 * @Date: 2021-09-07 16:01:19
 * @LastEditors: huangjunjian
 * @LastEditTime: 2021-09-07 16:18:22
 */
const fs = require("fs");
const path = require("path");

// const globalMockReg = /^(mock)[A-Za-z/]+\.js$/;
// const viewsStoreReg = /^(\/pages)[A-Za-z/]+(\/_mock\.js)$/;
// 兼容Windows、mac正则(正反斜杠)，已在下方统一处理
// const globalMockReg = /^(mock)[A-Za-z/|\\]+\.js$/;
// const viewsStoreReg = /^(src(\/|\\)pages)[A-Za-z/|\\]+(\/|\\_mock\.js)$/;
// 递归读取所有符合正则表达式的文件
// 目的是获取所有mock.js文件的绝对路径数组 -> 实现导入
function readFileList(dir, filesList = []) {
  // 读取一个文件夹
  const files = fs.readdirSync(dir);
  console.log(files);
  files.forEach((item) => {
    const fullPath = path.join(dir, item);
    const stat = fs.statSync(fullPath);
    // 判断读取的是文件 还是文件夹
    if (stat.isDirectory()) {
      readFileList(path.join(dir, item), filesList); // 递归读取文件
    } else {
      //兑取的是一个文件
      // const tmpDir = fullPath.replace(path.join(__dirname, '../'), '');
      // 兼容windows、mac正则（正反斜杠）
      const str = path.normalize(
        fullPath.replace(path.join(__dirname, "../"), "")
      );
      const tmpDir = str.replace(/\\/g, "/");
      // console.log('tmpDir', tmpDir)
      // if (globalMockReg.test(tmpDir) || viewsStoreReg.test(tmpDir)) {
      //   console.log('mock文件')
      //   filesList.push(fullPath);
      // }
      if (tmpDir.includes("_mock.js")) {
        filesList.push(fullPath);
      }
    }
  });
  return filesList;
}

// const filesList = [];
// const result = readFileList(path.join(__dirname, "../pages"), filesList);
// console.log(result);

function handuleMockApi(devServer) {
  // if (env !== "mock") {
  //   return false;
  // }
  const filesList = []; // 获取所有pages下的_mock.js文件的绝对路径
  readFileList(path.join(__dirname, "../pages"), filesList);
  // readFileList(path.join(__dirname, '../mock'), filesList);
  console.log(filesList);
  let arr = []; // 保存所有接口的数据的数组
  // 根据mock文件的路径信息循环导入
  filesList.map((item) => {
    try {
      const data = require(`${item}`);
      arr = [...arr, ...data];
    } catch (error) {
      console.error(`mock导入失败: ${item}`);
    }
    return item;
  });
  // 相当于上方的 全部写死
  // let arr = [
  //   {
  //     method: "get",
  //     url: "/test/login",
  //     response: "hehe",
  //   },
  //   {
  //     method: "get",
  //     url: "/api/getRecommend",
  //     response: "xixi",
  //   },
  //   {
  //     method: "get",
  //     url: "/test1",
  //     response: "test1",
  //   },
  // ];
  // 根据_mock.js 文件路径 循环导入 获取每个文件里保存的模拟接口数据
  // const arr1 = require("D:\\sjdv2\\music\\src\\pages\\Recommend\\_mock.js");
  // const arr2 = require("D:\\sjdv2\\music\\src\\pages\\Rank\\_mock.js");
  // const arr3 = require("D:\\sjdv2\\music\\src\\pages\\Singer\\_mock.js");
  // const arr4 = [...arr1, ...arr2, ...arr3];
  // console.log(123313, arr4);
  // 循环创建所有的接口数据
  for (let index = 0; index < arr.length; index += 1) {
    const { url, method, response } = arr[index];
    devServer.app[method](url, (_, res) => {
      res.send(response);
    });
  }
  return true;
}
module.exports = { handuleMockApi };
